home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-06 / an112x.zip / LOGGRAPH.C < prev   
C/C++ Source or Header  |  1991-11-15  |  8KB  |  294 lines

  1. #include <stdio.h>
  2. #include <ntt.h>
  3. #include <niterror.h>
  4. #include <nwbindry.h>
  5. #include <nwmisc.h>
  6. #include <string.h>
  7. #include <stdlib.h>
  8. #include <time.h>
  9. #include "acct.h"
  10.  
  11. #define PROG_NAME        "LOGGRAPH"
  12. #define DEFAULT_DIR        "\\SYSTEM"
  13. #define DEFAULT_ACCT_FILE    "\\NET$ACCT.DAT"
  14. #define    MAX_BINDERY_OBJ_LEN    48
  15. #define HOUR            3600
  16. #define QUARTER_HOUR        900
  17. #define MINUTE            60
  18.  
  19. typedef struct StationRecord {
  20.     LONG    clientID;
  21.     LONG    net;
  22.     LONG    nodeHigh;
  23.     WORD    nodeLow;
  24.     int    loggedIn;
  25.     struct StationRecord    *next;
  26. } STATION_RECORD;
  27.  
  28. void Usage(void);
  29. void ProcessRecord(ACCT_RECORD *record);
  30. time_t TimeStampToTimeT(BYTE *timeStamp);
  31. void DisplayLine(void);
  32. void LogInRecord(ACCT_RECORD *record);
  33. void LogOutRecord(ACCT_RECORD *record);
  34. STATION_RECORD *AddStation(ACCT_RECORD *record);
  35. void DisplayStations(void);
  36.  
  37. STATION_RECORD    *stationList = NULL;
  38. time_t        currentTime;
  39. int        granularity = HOUR;
  40.  
  41. void main(int argc, char **argv)
  42. {
  43.     char    acctFilePath[MAX_DIR_ENTRY] = "";
  44.     char    *path;
  45.     FILE    *acctFile;
  46.     int    itemsRead;
  47.     int    firstRecord = TRUE;
  48.     ACCT_RECORD    *record;
  49.  
  50.     if (argc > 3)
  51.         /* too many args */
  52.         Usage();
  53.     else {
  54.         /* 0-2 args */
  55.         while (argc-- > 1) {
  56.             if ((argv[argc][0] == '/') && (argv[argc][1] == 'a')) {
  57.                 /* found /a */
  58.                 path = &argv[argc][2];
  59.                 strcpy(acctFilePath, path);
  60.  
  61.                } else if ((argv[argc][0] == '/') && (argv[argc][1] == 'h')) {
  62.                 /* found /h */
  63.                 granularity = HOUR;
  64.  
  65.                } else if ((argv[argc][0] == '/') && (argv[argc][1] == 'q')) {
  66.                 /* found /q */
  67.                 granularity = QUARTER_HOUR;
  68.  
  69.                } else if ((argv[argc][0] == '/') && (argv[argc][1] == 'm')) {
  70.                 /* found /m */
  71.                 granularity = MINUTE;
  72.  
  73.             } else {
  74.                 /* unrecognized arg */
  75.                 Usage();
  76.                 exit(1);
  77.             }
  78.         }
  79.  
  80.         if (strlen(acctFilePath) == 0)
  81.             sprintf(acctFilePath, "%s%s", DEFAULT_DIR, DEFAULT_ACCT_FILE);
  82.  
  83.         acctFile = fopen(acctFilePath, "rb");
  84.         if (acctFile == NULL) {
  85.             printf("Unable to open %s\n", acctFilePath);
  86.             exit(1);
  87.         }
  88.  
  89.         do {
  90.             itemsRead = fread(&(record->length), sizeof(WORD), 1, acctFile);
  91.             if (itemsRead == 1) {
  92.                 itemsRead = fread(&(record->serverID), IntSwap(record->length), 1, acctFile);
  93.                 if (itemsRead != 1) {
  94.                     printf("Unexpected end of file %s\n", acctFilePath);
  95.                     break;
  96.                 }
  97.                 if (firstRecord) {
  98.                     currentTime = TimeStampToTimeT(record->timeStamp);
  99.  
  100.                     /* round to nearest time unit */
  101.                     currentTime = currentTime - (currentTime % granularity);
  102.  
  103.                     firstRecord = FALSE;
  104.                 }
  105.                 ProcessRecord(record);
  106.             }
  107.         } while(itemsRead);
  108.  
  109.         /* force display of one last line */
  110.         ProcessRecord(NULL);
  111.         DisplayStations();
  112.     }
  113. }
  114.  
  115. void Usage(void)
  116. {
  117.     printf("%s:  Display simple graph of user logins\n", PROG_NAME);
  118.     printf("Usage:\n\n");
  119.     printf("\t%s [/aAcctFileName]\n\n", PROG_NAME);
  120.     printf("\t/a     Specify accounting data file\n");
  121.     printf("\t       Default data file is %s%s\n", DEFAULT_DIR, DEFAULT_ACCT_FILE);
  122.     printf("\t/h     Display hourly login report (default)\n");
  123.     printf("\t/q     Display quarter-hourly login report\n");
  124.     printf("\t/m     Display minute-by-minute login report\n");
  125. }
  126.  
  127. void ProcessRecord(ACCT_RECORD *record)
  128. {
  129.     time_t    recordTime;
  130.     char    timeStr[18];
  131.  
  132.     if (record == NULL) {
  133.         /* force display of one last line */
  134.         DisplayLine();
  135.         return;
  136.     }
  137.  
  138.     recordTime = TimeStampToTimeT(record->timeStamp);
  139.  
  140.     while (recordTime > currentTime) {
  141.         DisplayLine();
  142.         currentTime = currentTime + granularity;
  143.     }
  144.  
  145.     if (record->recordType == NOTE_RECORD) {
  146.         if (IntSwap(record->chargeOrNote.note.noteType) == LOGIN_NOTE)
  147.             LogInRecord(record);
  148.  
  149.         else if (IntSwap(record->chargeOrNote.note.noteType) == LOGOUT_NOTE)
  150.             LogOutRecord(record);
  151.  
  152.         else if (IntSwap(record->chargeOrNote.note.noteType) == SERVER_TIME_MODIFIED_NOTE) {
  153.             strftime(timeStr, 18, "%m/%d/%y %H:%M:%S", localtime(&recordTime));
  154.             printf("********** Server time changed to %s **********\n", timeStr);
  155.  
  156.             /* set new current time */
  157.             currentTime = TimeStampToTimeT(record->timeStamp);
  158.  
  159.             /* round to nearest time unit */
  160.             currentTime = currentTime - (currentTime % granularity);
  161.         }
  162.     }
  163. }
  164.  
  165. void DisplayLine(void)
  166. {
  167.     char        timeStr[15];
  168.     STATION_RECORD    *currRec;
  169.  
  170.     strftime(timeStr, 15, "%m/%d/%y %H:%M", localtime(¤tTime));
  171.     printf("%s  ", timeStr);
  172.  
  173.     for(currRec=stationList; currRec; currRec=currRec->next)
  174.         if (currRec->loggedIn)
  175.             printf(" * ");
  176.         else
  177.             printf("   ");
  178.  
  179.     printf("\n");
  180. }
  181.  
  182. /* Given time stamp from accounting record, convert to seconds since 1/1/70 */
  183. time_t TimeStampToTimeT(BYTE *timeStamp)
  184. {
  185.     struct tm    timeStruct;
  186.  
  187.     timeStruct.tm_year = timeStamp[0];
  188.     timeStruct.tm_mon = timeStamp[1] - 1;    /* tm structures are 0-based */
  189.     timeStruct.tm_mday = timeStamp[2];
  190.     timeStruct.tm_hour = timeStamp[3];
  191.     timeStruct.tm_min = timeStamp[4];
  192.     timeStruct.tm_sec = timeStamp[5];
  193.  
  194.     return(mktime(&timeStruct));
  195. }
  196.  
  197. void LogInRecord(ACCT_RECORD *record)
  198. {
  199.     STATION_RECORD    *currRec,
  200.             *lastRec;
  201.  
  202.     if (!stationList)
  203.         stationList = AddStation(record);
  204.  
  205.     else {
  206.         currRec = stationList;
  207.         while (currRec) {
  208.             if ((currRec->clientID == record->clientID) &&
  209.                 (currRec->net == record->chargeOrNote.note.noteComment.loginNote.net) &&
  210.                 (currRec->nodeHigh == record->chargeOrNote.note.noteComment.loginNote.nodeHigh) &&
  211.                 (currRec->nodeLow == record->chargeOrNote.note.noteComment.loginNote.nodeLow)) {
  212.                 currRec->loggedIn = TRUE;
  213.                 break;
  214.  
  215.             } else {
  216.                 lastRec = currRec;
  217.                 currRec = currRec->next;
  218.             }
  219.         }
  220.         if (!currRec)
  221.             lastRec->next = AddStation(record);
  222.     }
  223. }
  224.  
  225. STATION_RECORD *AddStation(ACCT_RECORD *record)
  226. {
  227.     STATION_RECORD    *newRec;
  228.  
  229.     newRec = (STATION_RECORD *)malloc(sizeof(STATION_RECORD));
  230.     if (!newRec) {
  231.         printf("Out of memory\n");
  232.         exit(1);
  233.     }
  234.  
  235.     newRec->clientID = record->clientID;
  236.     newRec->net = record->chargeOrNote.note.noteComment.loginNote.net;
  237.     newRec->nodeHigh = record->chargeOrNote.note.noteComment.loginNote.nodeHigh;
  238.     newRec->nodeLow = record->chargeOrNote.note.noteComment.loginNote.nodeLow;
  239.     newRec->loggedIn = TRUE;
  240.     newRec->next = NULL;
  241.  
  242.     return(newRec);
  243. }
  244.  
  245. void LogOutRecord(ACCT_RECORD *record)
  246. {
  247.     STATION_RECORD    *currRec;
  248.  
  249.     currRec = stationList;
  250.     while(currRec) {
  251.         if ((currRec->clientID == record->clientID) &&
  252.             (currRec->net == record->chargeOrNote.note.noteComment.loginNote.net) &&
  253.             (currRec->nodeHigh == record->chargeOrNote.note.noteComment.loginNote.nodeHigh) &&
  254.             (currRec->nodeLow == record->chargeOrNote.note.noteComment.loginNote.nodeLow)) {
  255.             currRec->loggedIn = FALSE;
  256.             break;
  257.  
  258.         } else
  259.             currRec = currRec->next;
  260.     }
  261. }
  262.  
  263. void DisplayStations(void)
  264. {
  265.     int    ccode;
  266.     char    userName[MAX_BINDERY_OBJ_LEN];
  267.     STATION_RECORD    *currRec;
  268.     int    stationNum;
  269.  
  270.     /* display station numbers */
  271.     printf("\nStation Number:");
  272.     for (currRec = stationList, stationNum = 1;
  273.          currRec;
  274.          currRec = currRec->next, stationNum++)
  275.         printf("%3d", stationNum);
  276.  
  277.     printf("\n\n");
  278.  
  279.     /* display user name, net, and node numbers for each station */
  280.     for (currRec = stationList, stationNum = 1;
  281.          currRec;
  282.          currRec = currRec->next, stationNum++) {
  283.  
  284.         printf("Station %d:\n", stationNum);
  285.         ccode = GetBinderyObjectName(LongSwap(currRec->clientID), userName, (BYTE *)NULL);
  286.         if (ccode)
  287.             strcpy(userName, "(unknown)");
  288.  
  289.         printf("   %s\n", userName);
  290.         printf("   %lX\n", LongSwap(currRec->net));
  291.         printf("   %lX%X\n\n", LongSwap(currRec->nodeHigh), IntSwap(currRec->nodeLow));
  292.     }
  293. }
  294.